package acttest.dao.impl;

import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import acttest.dao.BaseDao;

@Repository
public class BaseDaoImpl<T> implements BaseDao<T> {
	
	EntityManagerFactory entityManagerFactory;
	EntityManager entityManager = null;
	JdbcTemplate jdbcTemplate;
	
	{
		getEntityManager();
	}

	public EntityManager getEntityManager() {
		if(entityManager == null) {
			 entityManager = entityManagerFactory.createEntityManager();
			 return entityManager;
		}
		else {
			return entityManager;
		}
	}
	
	/**JPA插入数据
	 * @param t 要保存的实体
	 * */
	@Override
	public void persist(T t) {
		entityManager.persist(t);
	}
	
	/**JPA删除数据
	 * @param t 要删除的实体
	 * */
	@Override
	public void remove(T t) {
		entityManager.remove(t);
	}
	
	/**JPA查找数据
	 * @param id 要查找数据的主键
	 * @param clazz 类型
	 * */
	@Override
	public T find(Object id,Class<T> clazz) {
		return getEntityManager().find(clazz, id);
	}
	
	/**JPA插入数据
	 * @param named NamedQuery名称
	 * */
	@Override
	public List<?> getNamedQuery(String named) {
		return getEntityManager().createNamedQuery(named).getResultList();
	}
	
	/**原生SQL
	 * @param sql
	 * */
	@Override
	public void excute(String sql) {
		jdbcTemplate.execute(sql);
	}
	
	/**原生SQL更新数据
	 * @param sql
	 * @return 返回受影响的数据条数
	 * */
	@Override
	public int update(String sql) {
		return jdbcTemplate.update(sql);
	}
	
	/**原生SQL查询数据
	 * @param sql
	 * @param clazz 返回类型
	 * */
	@Override
	public List<T> query(String sql,Class<T> clazz) {
		return jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(clazz));
	}
	
	/**原生SQL查询数据
	 * @param sql
	 * @param args Object数组
	 * @param clazz 返回类型
	 * */
	@Override
	public List<T> query(String sql,Object[] args,Class<T> clazz){
		return jdbcTemplate.query(sql, args, new BeanPropertyRowMapper<T>(clazz));
	}
	
	/**原生SQL查询数据
	 * @param sql
	 * @param clazz 返回类型
	 * */
	@Override
	public List<T> queryForList(String sql,Class<T> clazz){
		return jdbcTemplate.queryForList(sql, clazz);
	}
	
	/**原生SQL查询数据
	 * @param sql
	 * */
	@Override
	public List<Map<String,Object>> queryForList(String sql){
		return jdbcTemplate.queryForList(sql);
	}
	
	/**原生SQL查询数据
	 * @param sql
	 * @param args Object数组
	 * */
	@Override
	public List<Map<String,Object>> queryForList(String sql,Object[] args) {
		return jdbcTemplate.queryForList(sql, args);
	}
	
	
	public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
		this.entityManagerFactory = entityManagerFactory;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
}
